package com.zz.nondatain.view.fragment;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.viewpager2.widget.ViewPager2;

import com.zz.nondatain.MainActivity;
import com.zz.nondatain.R;
import com.zz.nondatain.adapter.BannerAdapter;
import com.zz.nondatain.base.BaseFragment;
import com.zz.nondatain.databinding.FragmentHomeBinding;
import com.zz.nondatain.view.activity.ActiveSignInActivity;
import com.zz.nondatain.view.activity.AnnouncementActivity;
import com.zz.nondatain.view.activity.AttendanceCalendarActivity;
import com.zz.nondatain.view.activity.MyAppealActivity;
import com.zz.nondatain.view.activity.MessageActivity;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import java.lang.reflect.Field;

/**
 * 首页Fragment，显示签到信息和功能入口
 */
public class HomeFragment extends BaseFragment<FragmentHomeBinding> {

    // 模拟的Banner图片列表
    private List<Integer> bannerImages = new ArrayList<>();

    public static HomeFragment newInstance() {
        return new HomeFragment();
    }

    // 签到时间段（假设两个时间段）
    private final String[][] timeSlots = {
            {"03:00", "06:15"},
            {"16:15", "16:30"}
    };

    // 用于定时更新剩余时间
    private final Handler handler = new Handler();
    private Runnable timeUpdateRunnable;

    // 用于Banner自动轮播
    private static final int BANNER_AUTO_SCROLL_DELAY = 3000; // 3秒切换一次
    private Runnable bannerAutoScrollRunnable;

    @Override
    protected void initView() {
        // 使用binding直接访问视图，无需findViewById
        setupBanner();
        setupClickListeners();
        updateProgressAndTime();

        // 启动定时器，每分钟更新一次剩余时间
        startTimeUpdates();

        // 启动Banner自动轮播
        startBannerAutoScroll();
    }

    @Override
    protected void initData() {
        // 数据初始化
    }

    @Override
    protected void initObservers() {
        // 观察者初始化
    }

    @Override
    protected FragmentHomeBinding getViewBinding(LayoutInflater inflater, ViewGroup container) {
        return FragmentHomeBinding.inflate(inflater, container, false);
    }

    private void setupBanner() {
        // 模拟添加Banner图片（实际应用中应从服务器获取或资源文件中加载）
        bannerImages.add(R.drawable.ic_launcher_background); // 这里用占位图
        bannerImages.add(R.drawable.ic_launcher_background);
        bannerImages.add(R.drawable.ic_launcher_background);

        // 设置Banner适配器
        BannerAdapter adapter = new BannerAdapter(bannerImages);
        binding.bannerViewpager.setAdapter(adapter);

        // 防止ViewPager2内部的RecyclerView拦截滑动事件
        // 这是解决ViewPager2与滚动冲突的另一种方式
        try {
            // 通过反射获取ViewPager2内部的RecyclerView
            Field recyclerViewField = ViewPager2.class.getDeclaredField("mRecyclerView");
            recyclerViewField.setAccessible(true);
            androidx.recyclerview.widget.RecyclerView recyclerView =
                    (androidx.recyclerview.widget.RecyclerView) recyclerViewField.get(binding.bannerViewpager);

            // 设置RecyclerView不拦截嵌套滑动
            recyclerView.setNestedScrollingEnabled(false);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 设置ViewPager2仅处理水平方向的滑动
        binding.bannerViewpager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);

        // 添加页面切换回调，用于更新指示器
        binding.bannerViewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                updateIndicator(position);

                // 每次手动滑动后，重置自动轮播
                resetBannerAutoScroll();
            }
        });

        // 初始化指示器
        setupIndicators(bannerImages.size());
    }

    /**
     * 开始Banner自动轮播
     */
    private void startBannerAutoScroll() {
        // 停止之前的自动轮播任务（如果有）
        stopBannerAutoScroll();

        // 创建新的轮播任务
        bannerAutoScrollRunnable = new Runnable() {
            @Override
            public void run() {
                if (isAdded() && getActivity() != null) {
                    // 获取当前页面索引
                    int currentItem = binding.bannerViewpager.getCurrentItem();
                    // 切换到下一个页面
                    binding.bannerViewpager.setCurrentItem((currentItem + 1) % bannerImages.size(), true);
                    // 继续延迟执行下一次轮播
                    handler.postDelayed(this, BANNER_AUTO_SCROLL_DELAY);
                }
            }
        };

        // 开始自动轮播
        handler.postDelayed(bannerAutoScrollRunnable, BANNER_AUTO_SCROLL_DELAY);
    }

    /**
     * 停止Banner自动轮播
     */
    private void stopBannerAutoScroll() {
        if (bannerAutoScrollRunnable != null) {
            handler.removeCallbacks(bannerAutoScrollRunnable);
        }
    }

    /**
     * 重置Banner自动轮播（在用户手动滑动后调用）
     */
    private void resetBannerAutoScroll() {
        // 先停止当前轮播
        stopBannerAutoScroll();
        // 重新开始轮播
        handler.postDelayed(bannerAutoScrollRunnable, BANNER_AUTO_SCROLL_DELAY);
    }

    private void setupIndicators(int count) {
        // 清空之前的指示器
        binding.indicatorContainer.removeAllViews();

        // 创建新的指示器点
        for (int i = 0; i < count; i++) {
            View indicator = new View(getContext());
            int size = (int) getResources().getDimension(R.dimen.indicator_size);
            android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(size, size);
            params.setMargins(8, 0, 8, 0);
            indicator.setLayoutParams(params);

            // 设置指示器样式
            indicator.setBackground(getResources().getDrawable(R.drawable.indicator_inactive));

            binding.indicatorContainer.addView(indicator);
        }

        // 默认选中第一个
        updateIndicator(0);
    }

    private void updateIndicator(int position) {
        int childCount = binding.indicatorContainer.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View indicator = binding.indicatorContainer.getChildAt(i);
            if (i == position) {
                indicator.setBackground(getResources().getDrawable(R.drawable.indicator_active));
            } else {
                indicator.setBackground(getResources().getDrawable(R.drawable.indicator_inactive));
            }
        }
    }

    private void setupClickListeners() {
        // 设置各功能按钮的点击事件
        binding.btnSignIn.setOnClickListener(v ->
                navigateToSignInFragment());

        binding.btnActiveSignIn.setOnClickListener(v -> {
            // 跳转到主动签到页面
            Intent intent = new Intent(getActivity(), ActiveSignInActivity.class);
            startActivity(intent);
        });

        binding.btnMessage.setOnClickListener(v -> {
            // 跳转到消息页面
            MessageActivity.start(requireContext());
        });

        // 设置"公告"按钮点击事件
        binding.btnAnnouncement.setOnClickListener(v -> {
            // 跳转到公告页面
            Intent intent = new Intent(getActivity(), AnnouncementActivity.class);
            startActivity(intent);
        });
        // 设置"申诉"按钮点击事件
        binding.btnAppeal.setOnClickListener(v -> {
            // 跳转到申诉页面
            Intent intent = new Intent(getActivity(), MyAppealActivity.class);
            startActivity(intent);
        });

        // 去签到按钮
        binding.btnGoSignIn.setOnClickListener(v -> navigateToSignInFragment());

        // 查看更多考勤统计
        binding.btnViewMoreStatistics.setOnClickListener(v -> {
            // 跳转到考勤月历页面
            Intent intent = new Intent(requireActivity(), AttendanceCalendarActivity.class);
            startActivity(intent);
        }) ;


    }

    private void navigateToSignInFragment() {
        try {
            // 通过Activity的ViewPager2导航到签到页面
            // MainActivity使用ViewPager2而不是Navigation组件
            if (getActivity() instanceof MainActivity) {
                MainActivity activity = (MainActivity) getActivity();
                // 切换到签到页面（索引为1）
                activity.navigateToPage(1);
            } else {
                showToast("无法导航到签到页面");
            }
        } catch (Exception e) {
            e.printStackTrace();
            showToast("导航失败");
        }
    }

    private void updateProgressAndTime() {
        // 获取当前时间
        Calendar now = Calendar.getInstance();
        int currentHour = now.get(Calendar.HOUR_OF_DAY);
        int currentMinute = now.get(Calendar.MINUTE);

        // 计算当前时间在一天中的分钟进度（基于24小时制）
        int currentTimeInMinutes = currentHour * 60 + currentMinute;
        int totalMinutesInDay = 24 * 60; // 24小时 = 1440分钟

        // 在View树完全加载后计算进度条宽度
        binding.getRoot().post(() -> {
            // 计算进度条宽度（根据当前时间占24小时的比例）
            int progressWidth = (int) (binding.getRoot().getWidth() * (currentTimeInMinutes / (float) totalMinutesInDay));
            ViewGroup.LayoutParams params = binding.progressLine.getLayoutParams();
            params.width = progressWidth;
            binding.progressLine.setLayoutParams(params);
        });

        // 更新剩余时间文本
        updateRemainingTimeText();
    }

    private void updateRemainingTimeText() {
        try {
            // 获取当前时间
            Calendar now = Calendar.getInstance();
            int currentHour = now.get(Calendar.HOUR_OF_DAY);
            int currentMinute = now.get(Calendar.MINUTE);
            int currentTimeInMinutes = currentHour * 60 + currentMinute;

            // 获取今天的日期部分
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
            String today = dateFormat.format(new Date());

            // 定义时间格式解析器
            SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault());

            // 寻找最近的下一个结束时间点
            Date nextEndTime = null;
            for (String[] timeSlot : timeSlots) {
                String endTimeStr = timeSlot[1];
                int endHour = Integer.parseInt(endTimeStr.split(":")[0]);
                int endMinute = Integer.parseInt(endTimeStr.split(":")[1]);
                int endTimeInMinutes = endHour * 60 + endMinute;

                // 如果结束时间还未到，则为下一个结束时间
                if (endTimeInMinutes > currentTimeInMinutes) {
                    nextEndTime = timeFormat.parse(today + " " + endTimeStr);
                    break;
                }
            }

            // 如果今天没有更多的结束时间，则使用明天的第一个时间段
            if (nextEndTime == null) {
                Calendar tomorrow = Calendar.getInstance();
                tomorrow.add(Calendar.DAY_OF_MONTH, 1);
                String tomorrowStr = dateFormat.format(tomorrow.getTime());
                nextEndTime = timeFormat.parse(tomorrowStr + " " + timeSlots[0][1]);
            }

            // 计算剩余时间
            long diffInMillis = nextEndTime.getTime() - now.getTimeInMillis();
            long diffHours = TimeUnit.MILLISECONDS.toHours(diffInMillis);
            long diffMinutes = TimeUnit.MILLISECONDS.toMinutes(diffInMillis) % 60;

            // 更新UI - 使用新的布局结构
            if (binding != null) {
                // 更新小时数
                binding.tvRemainingTimeHours.setText(String.valueOf(diffHours));
                // 更新分钟数
                binding.tvRemainingTimeMinutes.setText(String.valueOf(diffMinutes));
            }

        } catch (Exception e) {
            e.printStackTrace();
            if (binding != null) {
                // 在布局中显示错误信息
                binding.tvRemainingTimePrefix.setText("无法计算剩余时间");
                binding.tvRemainingTimeHours.setText("");
                binding.tvRemainingTimeHoursUnit.setText("");
                binding.tvRemainingTimeMinutes.setText("");
                binding.tvRemainingTimeMinutesUnit.setText("");
            }
        }
    }

    private void startTimeUpdates() {
        // 停止之前的更新任务（如果有）
        stopTimeUpdates();

        // 创建新的定时更新任务
        timeUpdateRunnable = new Runnable() {
            @Override
            public void run() {
                if (isAdded() && getActivity() != null) {
                    updateRemainingTimeText();
                    handler.postDelayed(this, 60000); // 每分钟更新一次
                }
            }
        };

        // 立即开始第一次更新
        handler.post(timeUpdateRunnable);
    }

    private void stopTimeUpdates() {
        if (timeUpdateRunnable != null) {
            handler.removeCallbacks(timeUpdateRunnable);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        // 在页面暂停时停止Banner自动轮播，避免后台运行浪费资源
        stopBannerAutoScroll();
    }

    @Override
    public void onResume() {
        super.onResume();
        // 在页面恢复时重新开始Banner自动轮播
        startBannerAutoScroll();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 确保在Fragment销毁时停止所有定时器
        stopTimeUpdates();
        stopBannerAutoScroll();
    }
} 